From 839b0f531764625693bdde11c4a18c9246b29a9c Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 3 Jan 2012 04:38:09 +0100 Subject: [PATCH] css: Handle 'currentColor' special value Computes to the value of the 'color' property, or when used on that property, is treated as 'inherit'. --- gtk/gtkcssstylefuncs.c | 15 ++++++++++++++- gtk/gtkcssstylepropertyimpl.c | 26 +++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/gtk/gtkcssstylefuncs.c b/gtk/gtkcssstylefuncs.c index af1ad5c708..7b53bbb736 100644 --- a/gtk/gtkcssstylefuncs.c +++ b/gtk/gtkcssstylefuncs.c @@ -173,6 +173,14 @@ rgba_value_parse (GtkCssParser *parser, GtkSymbolicColor *symbolic; GdkRGBA rgba; + if (_gtk_css_parser_try (parser, "currentcolor", TRUE)) + { + g_value_unset (value); + g_value_init (value, GTK_TYPE_CSS_SPECIAL_VALUE); + g_value_set_enum (value, GTK_CSS_CURRENT_COLOR); + return TRUE; + } + symbolic = _gtk_css_parser_read_symbolic_color (parser); if (symbolic == NULL) return FALSE; @@ -215,7 +223,12 @@ rgba_value_compute (GValue *computed, { GdkRGBA rgba, white = { 1, 1, 1, 1 }; - if (G_VALUE_HOLDS (specified, GTK_TYPE_SYMBOLIC_COLOR)) + if (G_VALUE_HOLDS (specified, GTK_TYPE_CSS_SPECIAL_VALUE)) + { + g_assert (g_value_get_enum (specified) == GTK_CSS_CURRENT_COLOR); + g_value_copy (_gtk_style_context_peek_property (context, "color"), computed); + } + else if (G_VALUE_HOLDS (specified, GTK_TYPE_SYMBOLIC_COLOR)) { if (_gtk_style_context_resolve_color (context, g_value_get_boxed (specified), diff --git a/gtk/gtkcssstylepropertyimpl.c b/gtk/gtkcssstylepropertyimpl.c index 2d1ae65d44..053cafbc28 100644 --- a/gtk/gtkcssstylepropertyimpl.c +++ b/gtk/gtkcssstylepropertyimpl.c @@ -45,6 +45,30 @@ /*** REGISTRATION ***/ +static void +color_compute (GtkCssStyleProperty *property, + GValue *computed, + GtkStyleContext *context, + const GValue *specified) +{ + g_value_init (computed, GDK_TYPE_RGBA); + + if (G_VALUE_HOLDS (specified, GTK_TYPE_CSS_SPECIAL_VALUE)) + { + GtkStyleContext *parent = gtk_style_context_get_parent (context); + g_assert (g_value_get_enum (specified) == GTK_CSS_CURRENT_COLOR); + + if (parent) + g_value_copy (_gtk_style_context_peek_property (parent, "color"), computed); + else + _gtk_css_style_compute_value (computed, + context, + _gtk_css_style_property_get_initial_value (property)); + } + else + _gtk_css_style_compute_value (computed, context, specified); +} + static void _gtk_style_property_register (const char * name, GType value_type, @@ -420,7 +444,7 @@ _gtk_css_style_property_init_properties (void) GTK_STYLE_PROPERTY_INHERIT, NULL, NULL, - NULL, + color_compute, &rgba); gtk_style_property_register ("font-size", G_TYPE_DOUBLE, -- 2.30.2